#include "parser.hpp"

Environment parse(vector<Variable>& argv, Environment& env)
{
	if(!argv.size()) {return env;}
	if( env._alias.find(argv[0].str) != env._alias.end() ) {
		argv.insert(argv.begin(),(Variable)"call");
		env.getvar("__return__") = env._func[argv[0].str](argv,env);
	} else if( env._func.find(argv[0].str) != env._func.end() ) {
		env.getvar("__return__") = env._func[argv[0].str](argv,env);
	} else {
		if(argv.size() >= 3) {
			if(isSettingOpcode(argv[1].str)) {
				argv.insert(argv.begin(),(Variable)"set");
				env.getvar("__return__") = env._func[argv[0].str](argv,env);
			} else {
				Variable tmp = argv[1];
				env.verify(tmp);
				if(tmp.type == tOpcode) {
					argv.insert(argv.begin(),(Variable)"math");
					env.getvar("__return__") = env._func[argv[0].str](argv,env);
				} else {
					if(!env.getvar("__interactive__").i) {
						cout << "***ERROR: Function `" << argv[0].str << "` not found\n";
						env.getvar("__return__") = (Variable)"";
					} else {
						env.getvar("__return__") = argv[argv.size()-1];
						env.verify(env.getvar("__return__"));
					}
				}
			}
		} else if(argv.size() == 2) {
			Variable tmp = argv[1];
			env.verify(tmp);
			if(tmp.type == tNumeric && tmp.i < 0) {
				Variable op = (Variable)"+";
				op.type = tOpcode;
				argv.insert(argv.begin()+1,op);
				argv.insert(argv.begin(),(Variable)"math");
				env.getvar("__return__") = env._func[argv[0].str](argv,env);
			} else {
				if(!env.getvar("__interactive__").i) {
					cout << "***ERROR: Function `" << argv[0].str << "` not found\n";
					env.getvar("__return__") = (Variable)"";
				} else {
					env.getvar("__return__") = argv[argv.size()-1];
					env.verify(env.getvar("__return__"));
				}
			}
		} else {
			if(!env.getvar("__interactive__").i) {
				cout << "***ERROR: Function `" << argv[0].str << "` not found\n";
				env.getvar("__return__") = (Variable)"";
			} else {
				env.getvar("__return__") = argv[argv.size()-1];
				env.verify(env.getvar("__return__"));
			}
		}
	}
	return env;
}
